package com.fabriciojf.exemplos;

import com.fabriciojf.model.Js_Role;
import com.fabriciojf.model.Usuario;
import com.fabriciojf.persistence.JpaPersistence;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

/**
 * Exemplo de criacao de usuario via jpa
 *
 * @author Fabricio S Costa fabriciojf@gmail.com
 * @since 01/12/2009
 * @version 1.0
 */
public class Main {

    public static void main(String args[]) throws SQLException, SQLException, ClassNotFoundException {

        System.out.println(new SimpleDateFormat("dd").format(new Date(2008, 2, 0)));
        System.out.println(new GregorianCalendar(2008, 2, 0).get(Calendar.DAY_OF_MONTH));

//        Main main = new Main();
//        main.modeloTreeMap();
    }

    /**
     * Modelo de persistencia com JPA
     */
    private void persist() {
        Js_Role role = new Js_Role();
        role.setRolename("admin");

        role = JpaPersistence.getInstance().save(role);

        Usuario usuario = new Usuario("fabriciojf", "dfgd", role);
        JpaPersistence.getInstance().save(usuario);
    }

    /**
     * Exemplo  de uso de Map
     */
    public void usandoMap() {
        Main main = new Main();

        // printa os objetos no console
        Map<String, Objeto> mapa = main.getMap();
        System.out.println(mapa.get("manel").getId());

        // loop em mapa pela chave
        for (String s : mapa.keySet()) {
            System.out.println(s);
        }

        // loop em mapa pelos valores
        for (Objeto pessoa : mapa.values()) {
            System.out.println(pessoa.getNome());
        }
    }

    /**
     * Gerando e retornando um Map
     */
    public Map<String, Objeto> getMap() {

        // primeiro objeto
        Objeto manel = new Objeto();
        manel.setId(1);
        manel.setNome("manel");

        // segundo objeto
        Objeto fabricio = new Objeto();
        fabricio.setId(2);
        fabricio.setNome("fabricio");

        // cria o mapa e indere os 2 objetos
        Map<String, Objeto> mapa = new HashMap<String, Objeto>();
        mapa.put(manel.getNome(), manel);
        mapa.put(fabricio.getNome(), fabricio);

        return mapa;
    }

    /**
     * Gerando um TreeMap
     */
    public void modeloTreeMap() {

        TreeMap<Integer, String> mapa = new TreeMap<Integer, String>();

        // add os itens no mapa
        mapa.put(1, "janeiro");
        mapa.put(2, "fevereiro");
        mapa.put(3, "marco");
        mapa.put(4, "abril");
        mapa.put(5, "maio");
        mapa.put(6, "junho");
        mapa.put(7, "julho");
        mapa.put(8, "agosto");
        mapa.put(9, "setembro");
        mapa.put(10, "outubro");
        mapa.put(11, "novembro");
        mapa.put(12, "dezembro");

        // recupera todas as chaves
        System.out.println("chaves: " + mapa.keySet());

        // recupera todos os valores
        System.out.println("valores: " + mapa.values());

        // recupera o valor da chave 10
        System.out.println("chave 10: " + mapa.get(10) + "\n");

        // recupera a primeira chave e o primeiro valor
        System.out.println("primeira chave: " + mapa.firstKey());
        System.out.println("primeiro valor: " + mapa.get(mapa.firstKey()));

        // recupera a ultima chave e o primeiro valor
        System.out.println("ultima chave: " + mapa.lastKey());
        System.out.println("ultima valor: " + mapa.get(mapa.lastKey()));

        // remove o primeiro valor
        System.out.println("removendo o primeiro valor: " + mapa.remove(mapa.firstKey()));

        // recupera todas as chaves apos a delecao
        System.out.println("chaves: " + mapa.keySet());
        System.out.println("valores: " + mapa.values());

        // remove o ultimo valor
        System.out.println("removendo o ultimo valor: " + mapa.remove(mapa.firstKey()));

        // recupera todas as chaves apos a delecao
        System.out.println("chaves: " + mapa.keySet());
        System.out.println("valores: " + mapa.values());
    }

    /**
     * Remoção dos objetos sem saldo da lista, feito em memória para aumentar o desempenho do sistema
     *
     * @param balancetes
     * @return
     */
    private List<Objeto> removerNull(List<Objeto> objetos) {
        Iterator<Objeto> it = objetos.iterator();
        while (it.hasNext()) {
            Objeto objeto = it.next();
            // comparando se o resultado do bigdecimal e igual a zero
            if (BigDecimal.ZERO.compareTo(objeto.getSaldo()) == 0) {
                it.remove();
            }
        }
        return objetos;
    }

    /**
     * Comparando valores com BigDecimal
     */
    private String saberCNumeroEMenor(BigDecimal outroBig) {
        BigDecimal bigTal = new BigDecimal(10);        
        if (bigTal.compareTo(outroBig) == 1) {
            return("maior q outroBig");
        }

        if (bigTal.compareTo(outroBig) == 0) {
            return("igual ao outroBig");
        }

        if (bigTal.compareTo(outroBig) == -1) {
            return("menor q outroBig");
        }
        return null;
    }
}
